package servicios;

import java.net.URI;
import java.util.Date;

import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;

import modelo.Factura;
import modelo.enums.Tarifa;
import persistencia.clientes.BDCliente;
import persistencia.clientes.BDClienteImpl;
import persistencia.facturas.BDFactura;
import persistencia.facturas.BDFacturaImpl;

import com.sun.jersey.api.client.ClientResponse.Status;

@Path("facturas")
public class FacturaService {

	private static final BDFactura datos = new BDFacturaImpl();
	private static final BDCliente datoscliente = new BDClienteImpl();

	@Context
	private UriInfo uriInfo;

	@GET
	@Produces(MediaType.APPLICATION_JSON)
	public Response devuelveTodasFacturas() {
		return Response.ok(datos.getAll()).build();
	}

	@Path("{codigo}")
	@GET
	@Produces(MediaType.APPLICATION_JSON)
	public Response devuelveFacturaPorCodigo(@PathParam("codigo") int codigo) {
		Factura factura = datos.findByCode(codigo);
		if (factura == BDFactura.FACTURA_NULL)
			return Response.status(Status.NOT_FOUND).build();
		return Response.ok(factura).build();
	}

	@POST
	@Produces(MediaType.APPLICATION_JSON)
	@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
	public Response anyadeFactura(@FormParam("codigo") int codigo,
			@FormParam("metros") int metros,
			@FormParam("tarifa") Tarifa tarifa, @FormParam("fecha") Date fecha,
			@FormParam("periodo") String periodo,
			@FormParam("cliente") String nif) {
		if (datos.findByCode(codigo) == BDFactura.FACTURA_NULL) {

			/*
			 * Factura factura = new Factura(codigo, metros, tarifa, fecha,
			 * periodo); datos.insert(factura);
			 * 
			 * Cliente cliente = datoscliente.findByNIF(nif);
			 * cliente.getFacturas().add(factura);
			 */
			UriBuilder uriBuilder = uriInfo.getAbsolutePathBuilder();
			URI uri = uriBuilder.path(Integer.toString(codigo)).build();
			return Response.created(uri).build();
		} else {
			return Response.status(Status.CONFLICT).build();
		}
	}

	@PUT
	@Path("/{codigo}")
	@Consumes(MediaType.APPLICATION_JSON)
	public Response actualizaEntrada(@PathParam("codigo") int codigo,
			Factura factura) {
		if (codigo != factura.getCodigo()) {
			return Response.status(Status.BAD_REQUEST).build();
		} else {
			Factura busqueda = datos.findByCode(codigo);
			if (busqueda == BDFactura.FACTURA_NULL) {
				return Response.status(Status.NOT_FOUND).build();
			}
			datos.update(factura);
		}
		return Response.status(Status.NO_CONTENT).build();
	}

	@Path("{codigo}")
	@DELETE
	@Produces(MediaType.APPLICATION_JSON)
	public Response borraFactura(@PathParam("codigo") int codigo) {
		Factura factura = datos.findByCode(codigo);
		if (factura != BDFactura.FACTURA_NULL) {
			datos.delete(codigo);
			return Response.status(Status.OK).build();
		}

		return Response.status(Status.NOT_FOUND).build();
	}

}
